//
//  main.c
//  BitOp
//
//  Created by chenyh on 2021/1/19.
//

#include <stdio.h>
/*
 二进制1101可表示为
 1*2三次方+1*2二次方+0*2一次方+1*2零次方 = 13
 用十进制表示就是用权值 8、4、2、1
 1*8+1*4+0*2+1*1 = 13
 二进制补码
 10000001 表示-1
 00000001 表示1
 根据高阶位是否为1 来表示是否为负
 
 要得到一个二进制补码数的相反数，最贱的方法是反转每一位（即0变为1，1变为0）,然后加1 因为1是00000001那么-1则是 11111110+1，或11111111
 二进制反码 00000001是1 则 11111110是-1  11111111是-0
 1、二进制小数
 一个普通的浮点数0.527表示如下
 5/10+2/100+7/1000 分母都是10的递增次幂
 二进制小数.101 表示为： 1/2 + 0/4 + 1/8  分母是2的递增次幂
 十进制表示时表示为: 0.5+0+0.125
 八进制451表示为
 4*8二次方+5*8一次方+1*8零次方 = 297十进制
 从2、8、16进制向10进制转 则将进制数每一位乘以次幂相加
 
 了解八进制：每个八进制对应3个二进制位、
 8421权值法
 八进制数0377的二进制形式是011 111 111
 十六进制：每个16进制对应4个二进制位
 0xA3F
 10*16二次方+3*16一次方+15*16零次方
 */


/**
 1、二进制反码或按位取反：~
 一元运算符~把1变为0，把0变为1  ~10011010 = 01100101
 2、按位与：&
 二元运算符&通过逐位比较两个运算对象，生成一个新值。对于每个位，只有两个运算对象中相应
 的位置都为1时，结果才为1。因此10010011 & 00111101 =  00010001
 3、按位或：|
 如果两个运算对象中相应的位为1，结果就为1：相应的一个位为真或两个位都为真，那么结果为1
 10010011|00111101 = 10111111
 4、按位异或：^
 如果两个运算对象中相应的位一个为1（但不是两个为1），结果为1 相应的一个位为真，切不是两个位同为1，那么结果为真
 10010011^
 00111101
 =
 10101110
 
 5、左移：<<
 将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数、
 左侧运算对象移出左末端位的值丢失，用0填充空出的位置。
 10001010 << 2
   00101000
 
 6、右移：>>
 将其左侧运算对象每一位的值向右移动其右侧运算对象指定的位数。
 左侧运算对象移出右末端位的值丢失。对于无符号类型。用0填充突出的位置。
 对于有符号的类型，其结果取决于机器。空出的位置可用0填充
 
 7、移位运算符
 移位运算符针对2的糜提供快速有效的乘法和出发
 number << n number乘以2的n次幂
 number >> n number为非负,则用number 除以2的n次幂
 */
int main(int argc, const char * argv[]) {
    // insert code here...
    int val = 1; // 0001 << 2  = 0100
    int val2 = 5; // 0101 >> 2 0001
    printf("%d\n",val<<2);
    printf("%d\n",val2>>2);
    return 0;
}
